21장 만든 것 세상에 올리기 (입문판)

출처: 클로드 코드 완벽 가이드 (코드팩토리 최지호)

이 장에서 딱 3가지만 가져가세요. 1. 배포가 무엇이고, 왜 그냥 올리기만 하면 안 되는지 설명한다. 2. Vercel(배포 플랫폼)에 가입하고 깃허브 프로젝트를 가져오는 과정을 따라 한다. 3. Deploy 버튼으로 배포하고, 환경변수를 넣은 뒤 다시 배포(Redeploy)하는 흐름을 따라 한다.

이 장에서 나오는 화면 이름, 플랜 이름, 버튼 위치는 원서/노트 기준 예시입니다. 서비스 화면은 자주 바뀌므로, 최신 모습과 무료 사용량은 공식 문서(Vercel 공식 문서 https://vercel.com/docs)에서 확인하세요.


들어가기 전에

이런 적 있죠? 열심히 만든 음식을 식탁에 차렸는데, 손님은 우리 집 주방까지 들어올 수가 없습니다. 아무리 맛있어도 손님 앞에 가져다 놓지 않으면 한 입도 못 먹습니다.

코드도 똑같습니다. 내 노트북 안에서만 잘 돌아가는 웹사이트는, 친구도 가족도 볼 수가 없습니다. "localhost:3000으로 들어와 봐" 해도 그건 내 컴퓨터에서만 열립니다.

이렇게 내 컴퓨터 안에만 있던 서비스를 누구나 인터넷 주소로 접속할 수 있게 "세상에 내놓는 일"이 바로 배포입니다. 이 장은 그 배포를 Vercel이라는 도구로 따라 하는 방법을 다룹니다.

이 장은 앞에서 만든 결과물을 그대로 씁니다. 20장에서 테스트(Playwright)로 점검을 끝낸 프로젝트가 있다고 보고 시작합니다. 지금 그 프로젝트가 없어도 괜찮습니다. 흐름만 눈으로 따라오면 됩니다.

새 용어 미리 한 줄씩: 배포(Deployment): 내가 만든 서비스를 인터넷에 올려 누구나 접속하게 만드는 일. 가게 문을 열고 간판을 다는 것과 같습니다. Vercel: 깃허브에 올린 코드를 자동으로 인터넷에 올려주는 배포 도구. 짐만 맡기면 알아서 배달까지 해주는 택배 회사 같은 것입니다. 환경변수(Environment Variables): API 키나 데이터베이스 주소처럼 코드에 직접 적기 위험한 비밀값을 따로 보관하는 칸. 현관 비밀번호를 문에 써붙이지 않고 따로 적어두는 것과 같습니다.


21-1 배포가 무엇인지 이해하기

이렇게 막힌 적 있죠?

집에서 케이크를 멋지게 구웠다고 해봅시다. 사진을 찍어 친구한테 보냈더니 친구가 말합니다. "맛있겠다. 그거 어디 가면 먹을 수 있어?"

그런데 그 케이크는 우리 집 식탁 위에만 있습니다. 가게도 없고, 배달도 안 하고, 주소도 없습니다. 친구는 그 케이크를 영원히 못 먹습니다.

내 노트북 안에서만 도는 웹사이트가 딱 이 상태입니다. 나만 볼 수 있고, 남은 아무도 못 들어옵니다.

그게 바로 배포

배포는 내 컴퓨터 안에 있던 서비스를 인터넷에 올려, 누구나 주소로 접속하게 만드는 일입니다. 케이크를 가게에 진열하고 주소를 알려주는 것과 같습니다.

그런데 한 가지 중요한 점이 있습니다. 배포는 "그냥 올리기"가 아닙니다. 가게 문을 열 때 위생도 챙기고, 손님이 몰려도 버티게 준비하고, 불이 나면 어쩔지도 생각하듯이 배포할 때도 보안, 성능, 오류 대응을 함께 챙겨야 합니다.

비유 클로드 코드/배포에서 주의
케이크를 가게에 진열 코드를 인터넷에 올림 (배포) 올리는 것 자체는 시작일 뿐. 끝이 아님
가게 위생 점검 보안 (API 키 노출 안 됨, .env 안 올림) 비밀값이 새면 큰일. 가장 먼저 챙김
손님 몰릴 때 대비 성능 (이미지 줄이기, 군더더기 패키지 빼기) 느린 사이트는 손님이 떠남
불나면 대피 계획 오류 대응 (404·500 에러 페이지 준비) 에러가 나도 사용자가 당황 안 하게

배포 전에 꼭 짚는 4가지

배포 직전에 아래 네 가지를 눈으로 확인하면 큰 사고를 막습니다.

배포 전 체크리스트
─────────────────────────────────
1) 보안    API 키가 코드에 박혀 있지 않은가?
           .env 파일이 .gitignore에 들어 있는가?
2) 성능    이미지 최적화, 안 쓰는 패키지 제거했는가?
3) 오류    404·500 같은 에러 페이지를 준비했는가?
4) 테스트  20장에서 만든 테스트가 전부 통과했는가?

특히 첫 번째 보안 항목이 제일 무섭습니다. 아래 잘못된 예와 올바른 예를 비교해 봅시다.

잘못된 예 .env 파일(비밀값이 담긴 파일)을 그냥 깃허브에 올림. 그러면 전 세계 사람이 내 API 키를 볼 수 있게 됩니다. 요금 폭탄이나 해킹으로 이어집니다.

올바른 예 .env 파일을 .gitignore에 적어 깃허브에 안 올라가게 막음. 그러면 비밀값은 내 컴퓨터와 Vercel 설정 칸에만 남습니다. 안전합니다.

이럴 때 이렇게 "배포했더니 500 에러가 떠요"라는 상황의 가장 흔한 원인은 환경변수를 Vercel에 안 넣은 것입니다. 이건 21-3에서 다시 자세히 다룹니다.

데이터베이스는 이미 인터넷에 있다

한 가지 헷갈리기 쉬운 점을 짚고 갑니다. 이 책의 예제는 데이터베이스로 Supabase를 씁니다. Supabase는 처음부터 인터넷(클라우드)에 있는 서비스라, 이미 누구나 접속 가능한 상태입니다.

그래서 우리가 따로 배포할 것은 웹사이트(화면) 부분뿐입니다. 데이터베이스는 그대로 두고, 웹사이트만 Vercel에 올리면 됩니다.

새 용어 한 줄: Supabase는 인터넷에 올라가 있는 데이터 저장소 서비스입니다. 회원 정보나 글 같은 데이터를 보관하는 클라우드 창고라고 보면 됩니다.

이 장에서 가져갈 핵심 - 배포 = 내 서비스를 인터넷에 올려 누구나 접속하게 만드는 일. - 그냥 올리기가 아니라 보안·성능·오류 대응까지 챙기는 일. - 데이터베이스(Supabase)는 이미 인터넷에 있으니, 웹사이트만 올리면 됨.


21-2 Vercel 준비하기

이렇게 막힌 적 있죠?

이사할 때 짐을 직접 트럭 빌리고, 운전하고, 옮기고, 정리까지 하려면 하루가 다 갑니다. 그런데 이삿짐센터에 맡기면 어떻게 되죠? 짐만 싸두면 트럭부터 운반, 정리까지 알아서 해줍니다.

배포도 직접 하려면 할 일이 많습니다. 서버 빌리고, 설정하고, 주소 연결하고, 보안 인증서 달고… 초보자에게는 벽처럼 느껴집니다.

이 귀찮은 일을 대신 해주는 이삿짐센터가 바로 Vercel입니다.

그게 바로 Vercel

Vercel은 깃허브에 올린 코드를 자동으로 인터넷에 배포해주는 플랫폼입니다. 코드를 깃허브에 올려두면, Vercel이 그걸 가져가 빌드(완성품으로 포장)하고, 전 세계 사용자가 볼 수 있게 올려줍니다.

새 용어 한 줄: 빌드(Build)는 사람이 쓴 코드를 컴퓨터가 실제로 실행할 수 있는 형태로 포장하는 과정입니다. 재료를 손질해 바로 낼 수 있는 요리로 만드는 단계라고 보면 됩니다.

비유 Vercel에서 주의
짐을 싸서 맡김 코드를 깃허브에 올림 깃허브에 올리지 않으면 Vercel이 가져갈 게 없음
이삿짐센터가 운반 Vercel이 빌드하고 배포 빌드 중 에러가 나면 배포가 멈춤
새 집 주소 프로젝트명.vercel.app 주소 이 주소를 친구에게 알려주면 접속 가능

왜 하필 Vercel을 쓰는지 세 가지로 정리하면: - Next.js를 만든 회사가 운영합니다. 그래서 Next.js 프로젝트와 궁합이 가장 좋습니다. - 무료로 시작할 수 있는 플랜(Hobby 플랜)이 있습니다. 돈 없이도 연습 가능합니다. - 깃허브와 연결해두면, 코드를 올릴 때마다 알아서 다시 배포해줍니다.

새 용어 한 줄: Next.js는 웹사이트를 만들 때 많이 쓰는 도구 모음입니다. 이 책의 예제 프로젝트가 Next.js로 만들어져 있습니다.

Hobby 플랜 — 무료로 시작하는 길

Vercel에는 여러 요금제가 있는데, 처음에는 무료인 Hobby 플랜으로 충분합니다.

새 용어 한 줄: Hobby 플랜은 Vercel의 무료 등급입니다. 개인 연습·포트폴리오용으로 넉넉하게 쓸 수 있습니다.

어떤 경우에 어떤 플랜이 맞는지 비교해 봅시다.

상황 어떤 플랜? 이유
개인 연습, 학습용, 포트폴리오 Hobby(무료) 비상업적 용도라 무료로 충분
돈 받고 운영하는 상업 서비스 유료 플랜 상업적 사용은 유료 플랜 대상

지금 우리는 연습 중이므로 Hobby 플랜을 고르면 됩니다. 무료 사용량의 구체 한도(트래픽·빌드 횟수 등)는 시간에 따라 바뀌므로, 정확한 수치는 Vercel 공식 문서에서 확인하세요.

따라 하기 1 — 회원가입

기본 사용법(안전한 길)부터 갑니다.

1) vercel.com/signup 접속
2) 플랜 종류에서 개인 프로젝트용(Hobby) 선택
3) 이름 입력 후 Continue
4) 깃허브 계정으로 로그인 (추천) 또는 이메일로 가입

깃허브로 로그인하길 추천하는 이유는, 다음 단계에서 깃허브 프로젝트를 바로 가져올 수 있어 편하기 때문입니다.

새 용어 한 줄: 깃허브(GitHub)는 코드를 인터넷에 저장하고 함께 관리하는 서비스입니다. 14장에서 다룬 적이 있습니다.

한 걸음 더 ▸ 여기서 깃허브는 여러 로그인 방법 중 한 예시일 뿐입니다. Vercel은 깃허브 말고도 Google, GitLab, Bitbucket 같은 여러 제공자로 로그인할 수 있어요. 카페 문 앞에 "구글로 들어오기", "깃허브로 들어오기" 같은 여러 출입문이 나란히 있는 것과 같습니다. 어느 문으로 들어와도 같은 카페 안입니다. 다만 이 책의 예제는 코드를 깃허브에 올려 쓰니, 깃허브 문으로 들어오면 다음 단계가 가장 매끄럽습니다.

비유 Vercel 로그인에서 주의
여러 개의 출입문 깃허브·Google·GitLab·Bitbucket 등 여러 로그인 제공자 어느 걸 골라도 같은 Vercel로 들어감
짐 창고와 같은 문 코드가 깃허브에 있으니 깃허브 문 창고와 같은 문이라야 Import가 가장 편함

따라 하기 2 — 깃허브 프로젝트 가져오기 (Import)

가입을 마치면 "Import Git Repository"(깃허브 저장소 가져오기) 화면이 보입니다. 여기서 내 프로젝트를 골라 가져옵니다.

새 용어 한 줄: Import는 깃허브에 있는 내 코드를 Vercel로 데려와 프로젝트로 만드는 일입니다. 창고에 있던 짐을 새 집으로 옮겨오는 것과 같습니다.

1) "Import Git Repository" 화면에서 내 프로젝트 검색
2) 원하는 저장소 옆 [Import] 버튼 클릭

따라 하기 3 — 프로젝트 설정 확인

Import를 누르면 새 프로젝트 설정 화면이 나옵니다. 여기서 한 군데만 눈여겨보면 됩니다. 바로 Framework Preset입니다.

새 용어 한 줄: Framework Preset은 "이 프로젝트가 무엇으로 만들어졌는지" Vercel이 알아맞힌 설정입니다. 보통 자동으로 Next.js라고 인식합니다.

New Project 화면 예시
─────────────────────────────────
Project Name:      k-nomad
Framework Preset:  Next.js   ← 보통 자동으로 잡힘
Root Directory:    ./

> Environment Variables   ← 지금 안 넣어도 됨 (21-3에서)

         [ Deploy ]

여기서 Framework Preset이 Next.js로 잘 잡혔는지만 확인하면 됩니다.

잘못된 예 Framework Preset이 비어 있거나 엉뚱한 값인데 그냥 Deploy를 누름. 그러면 빌드가 실패할 수 있습니다.

올바른 예 자동 인식이 안 됐으면 목록에서 직접 "Next.js"를 골라줌. 그러면 Vercel이 올바른 방법으로 빌드합니다.

이럴 때 이렇게 환경변수(API 키 등)는 지금 안 넣어도 됩니다. 첫 배포를 먼저 해보고, 그다음에 넣는 게 더 쉽습니다. 이건 21-3에서 합니다.

이 절에서 가져갈 핵심 - Vercel은 깃허브 코드를 자동으로 배포해주는 도구. - Hobby 플랜(무료)으로 연습을 시작. - 순서는 가입, Import(프로젝트 가져오기), Framework Preset(Next.js) 확인입니다.


21-3 진짜로 배포하고 다시 배포하기

이렇게 막힌 적 있죠?

택배를 보낼 때를 떠올려 봅시다. 물건을 접수하면 "배송 시작"이라고 뜹니다. 그런데 받는 사람 주소를 안 적으면? 물건이 어디로도 도착하지 못합니다.

배포도 똑같습니다. Deploy 버튼을 누르면 배송이 시작되지만, "주소"에 해당하는 환경변수를 안 넣으면 사이트가 제대로 열리지 않습니다.

이 절에서는 배송 접수(Deploy), 추적(빌드 로그 확인), 주소 입력(환경변수), 재발송(Redeploy)까지 순서대로 한 번에 따라 합니다.

그게 바로 Deploy와 Redeploy

Deploy는 처음으로 사이트를 인터넷에 올리는 일입니다. Redeploy는 설정을 바꾼 뒤, 그 변경을 반영하려고 다시 배포하는 일입니다.

새 용어 한 줄: Redeploy(재배포)는 환경변수 같은 설정을 바꾼 다음 다시 한 번 배포하는 것입니다. 주소를 잘못 적어 다시 보내는 택배 재발송과 같습니다.

비유 배포에서 주의
택배 접수 [Deploy] 버튼 클릭 누르면 "Deploying..."으로 바뀌며 포장(빌드) 시작
배송 추적 Build Logs(빌드 기록) 확인 빨간 글씨가 보이면 배송 실패 신호
받는 사람 주소 환경변수(Environment Variables) 주소가 없으면 사이트가 500 에러로 멈춤
주소 고쳐 재발송 Redeploy(재배포) 환경변수를 바꾸면 반드시 다시 배포해야 반영됨

따라 하기 4 — Deploy 누르기

[Deploy] 버튼 클릭
  → "Deploying..." 으로 화면이 바뀜
  → Build Logs(빌드 기록)가 실시간으로 흐름
  → 의존성 설치 → 빌드 → 최적화 순서로 진행

새 용어 한 줄: Build Logs는 빌드가 어떻게 진행되는지 한 줄씩 보여주는 기록입니다. 일이 잘 됐는지, 어디서 막혔는지를 알려주는 일지라고 보면 됩니다.

따라 하기 5 — 빌드 결과 확인하기

빌드가 끝나면 성공이거나 실패입니다. 둘 다 대처법이 있습니다.

성공한 경우
  → [Continue to Dashboard] 버튼 클릭
  → 대시보드(프로젝트 관리 화면)로 이동

실패한 경우
  → [Logs] 탭에서 빨간 에러 글씨 확인
  → 그 에러 메시지를 복사
  → 클로드 코드에 붙여넣고 "이 에러 고쳐줘"라고 부탁

새 용어 한 줄: 대시보드(Dashboard)는 내 프로젝트의 상태, 배포 기록, 설정을 모아 보는 메인 화면입니다.

이럴 때 이렇게 빌드가 실패했다고 당황하지 않아도 됩니다. 빨간 에러를 그대로 클로드 코드에 붙여넣으면, 원인과 고치는 방법을 알려줍니다. 앞 장에서 클로드 코드에게 코드를 고쳐달라고 부탁하던 것과 똑같은 방식입니다.

따라 하기 6 — 환경변수 넣기

이제 "받는 사람 주소"에 해당하는 환경변수를 넣을 차례입니다.

Settings → Environment Variables 메뉴로 이동

  Key                              Value
  NEXT_PUBLIC_SUPABASE_URL         https://xxx...
  NEXT_PUBLIC_SUPABASE_ANON_KEY    eyJhb...

  → .env(또는 .env.local) 파일에 있던 모든 KEY=VALUE를 그대로 입력
  → [Save] 버튼으로 저장

여기서 입력하는 값은 내 컴퓨터의 .env 파일에 있던 값과 똑같습니다. .env 파일은 깃허브에 안 올렸기 때문에(21-1의 보안 규칙), Vercel은 이 값을 모릅니다. 그래서 여기에 직접 한 번 더 적어주는 것입니다.

한 걸음 더 ▸ .env 파일에 값이 여러 개라 일일이 치기 번거롭다면, "Import .env" 기능으로 파일째 한 번에 넣을 수도 있습니다. 기본은 하나씩 입력이고, 이건 편의 기능입니다.

잘못된 예 환경변수를 넣지 않고 사이트에 접속함. 그러면 데이터베이스 주소를 모르니 500 에러(서버 오류)가 뜹니다.

올바른 예 .env의 모든 값을 Environment Variables에 넣고 Save함. 그러면 사이트가 데이터베이스와 연결되어 정상 작동합니다.

따라 하기 7 — Redeploy 하기

환경변수를 Save해도, 이미 끝난 배포에는 바로 반영되지 않습니다. 반드시 다시 배포(Redeploy)해야 새 값이 적용됩니다.

[Save]를 누르면 화면 아래에 [Redeploy] 안내 막대가 뜸
  → [Redeploy] 클릭
  → 확인 창에서 다시 [Redeploy] 클릭

만약 [Redeploy] 안내가 사라졌다면 (수동으로 재배포)
  → Deployments 탭 이동
  → ··· (점 세 개) 메뉴 → Create Deployment
  → main 브랜치 선택
  → [Create Deployment] 클릭

새 용어 한 줄: Deployments는 지금까지의 배포 기록이 쌓이는 탭입니다. 여기서 수동으로 새 배포를 시작할 수도 있습니다. 새 용어 한 줄: main 브랜치는 프로젝트의 기본(대표) 코드 줄기입니다. 보통 이걸 골라 배포합니다.

이럴 때 이렇게 "환경변수를 넣었는데도 사이트가 안 고쳐졌어요"의 99%는 Redeploy를 안 한 경우입니다. Save만으로는 부족하고, 꼭 한 번 더 배포해야 한다는 점을 기억하세요.

따라 하기 8 — 사이트 방문하고 점검하기

배포가 끝났으면 실제로 들어가 봅니다.

Overview 탭 → [Visit] 버튼 클릭
  → 배포된 주소: 프로젝트명.vercel.app

들어가서 아래를 하나씩 눌러보며 확인합니다.

사이트 점검 목록
─────────────────────────────────
- 모든 페이지가 잘 열리는가?
- 데이터베이스(Supabase) 연동이 되는가? (글·목록 등이 보이는가)
- 버튼·검색 같은 기능이 작동하는가?
- 휴대폰 화면에서도 모양이 깨지지 않는가? (반응형)

자주 만나는 에러와 해결법

배포 후 흔히 만나는 문제를 표로 모았습니다.

증상 원인 해결
500 서버 에러 환경변수를 안 넣음 Settings → Environment Variables 확인 후 Redeploy
"URL and Key" 관련 에러 Supabase 주소·키 값이 틀림 환경변수 값을 다시 정확히 입력
빌드 실패 코드 에러나 패키지 문제 Logs 탭의 에러를 클로드 코드에 붙여넣어 수정
페이지가 안 열림 라우팅(주소 연결) 설정 문제 next.config.js 설정 확인

이럴 때 이렇게 어떤 에러든 공통 처방은 비슷합니다. 빨간 에러 메시지를 복사해서 클로드 코드에게 보여주고 "고쳐줘"라고 부탁하면 됩니다. 혼자 끙끙대지 말고 에러 글자를 그대로 넘기는 게 가장 빠릅니다.

이 절에서 가져갈 핵심 - Deploy를 누르면 빌드가 시작되고, Build Logs로 진행을 봄. - 환경변수(.env의 값들)를 Settings에 넣고 Save함. - 환경변수를 바꿨으면 반드시 Redeploy해야 반영됨. - 다 되면 Visit으로 사이트에 들어가 기능을 하나씩 점검함.


한눈에 정리 — 로컬과 배포는 무엇이 다른가

내 컴퓨터에서 돌릴 때와 Vercel에 올렸을 때를 나란히 보면 차이가 또렷해집니다.

항목 내 컴퓨터(로컬) Vercel 배포
누가 접속? 나만 (localhost) 전 세계 누구나 (주소로)
환경변수 .env 파일 Settings → Environment Variables
서버 켜기 npm run dev로 직접 켬 Vercel이 알아서 관리
주소 localhost:3000 프로젝트명.vercel.app
다시 올리기 직접 다시 실행 깃허브에 올리면 자동 배포
보안 주소(HTTPS) 없음 자동으로 붙음
비용 무료 Hobby 무료 / 상업용은 유료 플랜

그리고 첫 배포(Deploy)와 재배포(Redeploy)의 차이도 정리합니다.

항목 첫 배포 (Deploy) 재배포 (Redeploy)
언제? 처음 사이트를 공개할 때 설정·코드를 바꾼 뒤 반영할 때
시작 방법 [Deploy] 버튼 [Redeploy] 막대 또는 Create Deployment
환경변수 나중에 넣어도 됨 바꿨으면 반드시 다시 배포

스스로 점검하기

아래 질문에 스스로 답해 보세요. 막히면 해당 절로 돌아가면 됩니다.

질문 1: 배포가 "그냥 코드를 올리는 것"이 아니라면, 무엇을 더 챙겨야 하나요? 힌트: 21-1의 비유 표(위생·손님·대피)를 떠올려 보세요.

질문 2: 환경변수를 Vercel에 넣고 Save만 했는데 사이트가 안 고쳐집니다. 무엇을 빠뜨렸나요? 힌트: "받는 사람 주소를 고친 뒤 택배를 어떻게 한다고 했죠?"

질문 3: 배포가 실패해 빌드가 멈췄습니다. 에러 원인은 어디서 보고, 어떻게 고치면 빠를까요? 힌트: 21-3의 [Logs] 탭과 클로드 코드 활용을 떠올려 보세요.

질문 4: 무료 Hobby 플랜은 어떤 경우에 적합하고, 어떤 경우엔 유료 플랜이 필요할까요? 힌트: 21-2의 플랜 비교 표를 보세요.


다음 장 예고

여기까지 따라왔다면, 내가 만든 서비스를 인터넷에 올려 친구에게 주소를 보낼 수 있게 됐습니다. 다음 장에서는 클로드 코드를 더 강력하게 써주는 바깥 도구들을 하나씩 소개합니다. 지금 몰라도 됩니다.

난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플